01 matrix [DP]¶
Time: O(MxN); Space: O(MxN); medium
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell. The distance between two adjacent cells is 1.
Example 1:
Input: matrix =
0 0 0
0 1 0
0 0 0
Output:
0 0 0
0 1 0
0 0 0
Example 2:
Input: matrix =
0 0 0
0 1 0
1 1 1
Output:
0 0 0
0 1 0
1 2 1
Notes:
The number of elements of the given matrix will not exceed 10,000.
There are at least one 0 in the given matrix.
The cells are adjacent in only four directions: up, down, left and right.
[6]:
import collections
import queue
class Solution1(object):
def updateMatrix(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[List[int]]
"""
queue = collections.deque([])
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == 0:
queue.append((i, j))
else:
matrix[i][j] = float("inf")
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
while queue:
cell = queue.popleft()
for dir in dirs:
i, j = cell[0]+dir[0], cell[1]+dir[1]
if not (0 <= i < len(matrix)) or \
not (0 <= j < len(matrix[0])) or \
matrix[i][j] <= matrix[cell[0]][cell[1]] + 1:
continue
queue.append((i, j))
matrix[i][j] = matrix[cell[0]][cell[1]]+1
return matrix
[7]:
s = Solution1()
matrix = [
[0, 0, 0],
[0, 1, 0],
[0, 0, 0]
]
assert s.updateMatrix(matrix) == [
[0, 0, 0],
[0, 1, 0],
[0, 0, 0]
]
matrix = [
[0, 0, 0],
[0, 1, 0],
[1, 1, 1]
]
assert s.updateMatrix(matrix) == [
[0, 0, 0],
[0, 1, 0],
[1, 2, 1]
]